package org.example.framework;

import org.example.framework.register.RemoteRegister;

import java.util.ArrayList;
import java.util.List;

/**
 * @author shenguangyang
 */
public class ClusterInvoker implements Invoker {
    private final List<Invoker> invokers;

    public ClusterInvoker() {
        this.invokers = new ArrayList<>();
    }

    public static Invoker join(Class<?> interfaceClass) {
        ClusterInvoker clusterInvoker = new ClusterInvoker();
        // 从注册中心查看urls
        // 根据类名-->ip + port
        // 模拟从注册中心获取url列表
        List<ServerUrl> urlList = RemoteRegister.get(interfaceClass.getName());
        urlList.forEach(serverUrl -> {
            Protocol protocol = ProtocolFactory.getProtocol(serverUrl.getProtocol());
            Invoker refer = protocol.refer(serverUrl);
            clusterInvoker.addInvoker(refer);
        });
        return clusterInvoker;
    }

    public void addInvoker(Invoker invoker) {
        this.invokers.add(invoker);
    }

    @Override
    public Object invoke(Invocation invocation) {
        // 选择一个负载均衡算法
        return LoadBalance.random(invokers).invoke(invocation);
    }
}
